import axios from 'axios'
import { message } from 'ant-design-vue'
import router from '../router' // 假设你的路由实例在 src/router/index.js

// 创建 axios 实例
const service = axios.create({
  baseURL: '/', // API 的 base_url, Vite proxy 会处理实际的转发

  timeout: 10000 // 请求超时时间
})

// 请求拦截器
service.interceptors.request.use(
  config => {
    // 在发送请求之前做些什么
    const token = localStorage.getItem('token') // 从 localStorage 获取 token
    if (token) {
      // 让每个请求携带自定义 token 请根据实际情况自行修改
      config.headers['Authorization'] = `Bearer ${token}`
    }
    return config
  },
  error => {
    // 对请求错误做些什么
    console.error('Request Error:', error) // for debug
    return Promise.reject(error)
  }
)

// 响应拦截器
service.interceptors.response.use(
  /**
   * 如果你想获取诸如 headers 或 status 之类的http信息
   * 请返回 response => response
  */

  /**
   * 通过自定义代码确定请求状态
   * 这里只是一个例子
   * 你也可以通过HTTP状态代码判断状态
   */
  response => {
    const res = response.data

    // 如果自定义代码不是 200，则判断为错误。
    // 这里假设您的后端接口成功时 code 为 200
    if (res.code !== 200) {
      message.error(res.message || 'Error')

      // 50008: 非法的token; 50012: 其他客户端登录了; 50014: Token 过期了;
      // 这里可以根据后端定义的错误码进行特定处理
      if (res.code === 401 || res.code === 50008 || res.code === 50012 || res.code === 50014) {
        // 例如: 重新登录
        // Modal.confirm({
        //   title: '确认登出',
        //   content: '您已登出，可以取消继续留在该页面，或者重新登录',
        //   okText: '重新登录',
        //   cancelText: '取消',
        //   onOk: () => {
        //     // store.dispatch('user/resetToken').then(() => {
        //     //   location.reload() // 为了重新实例化vue-router对象 避免bug
        //     // })
        //     localStorage.removeItem('token')
        //     router.push(`/admin/login?redirect=${router.currentRoute.value.fullPath}`)
        //   }
        // })
        message.error('认证失败或Token已过期，请重新登录。')
        localStorage.removeItem('token')
        // 确保在非登录页才跳转，避免循环跳转
        if (router.currentRoute.value.name !== 'AdminLogin') {
            router.push(`/admin/login?redirect=${router.currentRoute.value.fullPath}`)
        }
      }
      return Promise.reject(new Error(res.message || 'Error'))
    }
    // 如果响应成功，直接返回数据部分
    return res
  },
  error => {
    console.error('Response Error:', error) // for debug
    let errorMessage = '网络错误，请稍后再试'
    if (error.response) {
      // 请求已发出，但服务器响应的状态码不在 2xx 范围内
      switch (error.response.status) {
        case 400:
          errorMessage = error.response.data.message || '请求参数错误'
          break
        case 401:
          errorMessage = '未授权，请重新登录'
          localStorage.removeItem('token')
          if (router.currentRoute.value.name !== 'AdminLogin') {
            router.push(`/admin/login?redirect=${router.currentRoute.value.fullPath}`)
          }
          break
        case 403:
          errorMessage = '禁止访问'
          break
        case 404:
          errorMessage = '请求的资源未找到'
          break
        case 500:
        case 502:
        case 503:
        case 504:
          errorMessage = error.response.data.message || '服务器内部错误'
          break
        default:
          errorMessage = `连接错误 ${error.response.status}`
      }
    } else if (error.request) {
      // 请求已发出，但没有收到响应
      errorMessage = '请求超时或服务器未响应'
    } else {
      // 在设置请求时触发了一个错误
      errorMessage = error.message
    }
    message.error(errorMessage)
    return Promise.reject(error)
  }
)

export default service